home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 6
/
FM Towns Free Software Collection 6.iso
/
t_os
/
book
/
src
/
vector.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-07-08
|
3KB
|
111 lines
/*
High-C サンプルプログラム (割り込みベクタの変更)
int 24h (I/Oリクエストエラー処理) のフック
by Y.Kurihara (Nif PDC01620)
↑これをちょっと手直ししたもの
*/
#include <stdio.h>
#include <stdefs.h>
#include <stdlib.h>
#include <msdos.cf>
#include <interrup.cf>
/* CTRL-C割り込み(int 23h) および 致命的エラー割り込み(int 24h) のトラップ */
typedef struct {
int selecter ; /* プロテクトモード割り込みベクタのセレクタ */
int offset ; /* プロテクトモード割り込みベクタのオフセット */
int real_vect ; /* リアルモード割り込みベクタ */
} vector_t ;
vector_t int23, int24 ;
#pragma Calling_convention( C_interrupt ) ; /* 割り込みルーチン開始 */
void int23h( Machine_status Stat )
{
Stat.Flags = Stat.Flags ; /* dummy */
return ; /* iret */
}
void int24h( Machine_status Stat )
{
Stat.AX = 0 ; /* system call fault */
return ; /* iret */
}
#pragma Calling_convention() ; /* 割り込みルーチン終了 */
void dos_extender_call( int interrupt, int param )
{
Registers.DS.W = getds() ;
Registers.AX.W = interrupt ;
Registers.CX.W = param ;
calldos() ;
}
void set_vector( void )
/* int 23h/24h の割り込みベクタを int23h()/int24h() に変更 */
{
union {
_far void (*ptr)() ;
struct { unsigned int off ; unsigned short seg ; } reg ;
} farptr23h, farptr24h ;
/* int 23h の退避 */
dos_extender_call( 0x2502, 0x0023 ) ;
int23.selecter = Registers.ES.W ;
int23.offset = Registers.BX.R ;
dos_extender_call( 0x2503, 0x0023 ) ;
int23.real_vect = Registers.BX.R ;
farptr23h.ptr = (_far void (*)())int23h ;
Registers.DS.W = farptr23h.reg.seg ;
Registers.AX.W = 0x2506 ;
Registers.CX.W = 0x0023 ;
Registers.DX.R = farptr23h.reg.off ;
calldos() ;
/* int 24h の退避 */
dos_extender_call( 0x2502, 0x0024 ) ;
int24.selecter = Registers.ES.W ;
int24.offset = Registers.BX.R ;
dos_extender_call( 0x2503, 0x0024 ) ;
int24.real_vect = Registers.BX.R ;
farptr24h.ptr = (_far void (*)())int24h ;
Registers.DS.W = farptr24h.reg.seg ;
Registers.AX.W = 0x2506 ;
Registers.CX.W = 0x0024 ;
Registers.DX.R = farptr24h.reg.off ;
calldos() ;
}
void reset_vector( void )
/* int 23h/24h の割り込みベクタを元に戻す */
{
/* int 23h の復帰 */
Registers.AX.W = 0x2507 ;
Registers.CX.W = 0x0023 ;
Registers.DS.W = int23.selecter ;
Registers.DX.R = int23.offset ;
Registers.BX.R = int23.real_vect ;
calldos() ;
/* int 24h の復帰 */
Registers.AX.W = 0x2507 ;
Registers.CX.W = 0x0024 ;
Registers.DS.W = int24.selecter ;
Registers.DX.R = int24.offset ;
Registers.BX.R = int24.real_vect ;
calldos() ;
}